
// 全局执行上下文: 所有js代码执行之前,都必须有该环境


// 函数执行上下文: 
// 一个函数运行之前,创建的一块内存空间,
// 空间中包含有该函数执行所需要的数据,
// 为该函数执行提供支持

// 执行上下文堆栈: call stack 所有上下文组成的内存空间
// 栈:数据结构:先进后出

// js引擎始终执行的是栈顶的上下文


// 执行上下文中的内容
// 1. this指向
// 2. VO变量对象 variable object
//    vo中记录了该环境中所有声明的参数,变量和函数
// 全局上下文中的vo, 也可以称之为GO, global object

// 当前正在执行的vo, 称之为AO
// 当一个上下文中的代码执行的时候,如果上下文中不存在某个属性,则会从之前的上下文寻找

// 运行一个函数, 假设如下
// 1) 确定形参值,
// 2) 确定特殊变量 arguments
// 3) 确定当前函数中所有var声明的变量,将他们的值设置为undefined
//  3.1)如果vo中已有该名称,直接忽略
// 4) 确定当前函数中通过字面量声明的函数,将他们的值设置为指向的函数对象
//  4.1)如果vo中已存在该名称,函数直接覆盖
/**
 * function A(a,b){
 *   console.log(a,b,c)
 *   var c = 123
 *   console.log(a,b,c)
 * }
 * A(1,2)
 */

// 
; (function () {
    //return
    // 创建函数上下文
    console.log("global 1")
    // 删除函数上下文


    let a = 1
    function A() {
        // 创建函数上下
        console.log("A1")
        // 删除函数上下文
        function b() {
            console.log("b")
        }
        // 创建函数上下
        b()
        // 删除函数上下文

        // 创建函数上下
        console.log("A2")
        // 删除函数上下文
    }
    // 创建函数上下文
    A()
    // 删除函数上下文

    // 创建函数上下文
    console.log("global 2")
    // 删除函数上下文

    // 还没执行前的上下文

})();